#include <iostream>
#include <cstring>
using namespace std;

const int N = 100010;
int h[N], e[N], ne[N], idx = 0; //邻接表用于存储图
int q[N], l = 0, r = -1;        //队列用于存储各个遍历到的点
int n, m, a, b;                 //用于取得输入
int d[N];                       //记录各个对应的点对应的步数

void add(int a, int b) //加入一条从a指向b的单向边
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
    return;
}

int bfs(int x) //宽度优先遍历这个图
{
    q[++r] = 1;    //从起点点1开始
    d[1] = 0;      //起点到自己的距离为0
    while (l <= r) //只要队列里面还有东西，那就继续找
    {
        x = q[l++];                            //这次遍历的根结点出队列
        if (x == n)                            //如果已经到了终点
            return d[x];                       //直接返回距离
        for (int i = h[x]; i != -1; i = ne[i]) //不然则遍历这个根结点所有可以拓展的结点
        {
            int j = e[i];   //可拓展的结点之一
            if (d[j] != -1) //要是被别人遍历过了，则直接跳过
                continue;
            d[j] = d[x] + 1; //比根结点距离多一步
            q[++r] = j;      //拓展后入队列
        }
    }
    return -1; //要是队列空了都还没找到，既不可达
}

int main()
{
    memset(h, -1, sizeof h);
    memset(d, -1, sizeof d);
    cin >> n >> m;
    while (m--)
    {
        cin >> a >> b;
        add(a, b);
    }
    cout << bfs(1);
    return 0;
}